#pragma once
#include <queue>
#include <pthread.h>

using callback = void(*)(void* arg);

//任务结构体
template <typename T>
struct Task {
	Task<T>() 
	{
		funtion = nullptr;
		arg = nullptr;
	}
	Task<T>(callback f, void* arg)
	{
		funtion = f;
		this->arg = static_cast<T*>(arg);
	}
	callback funtion;					//泛型编程
	T* arg;								//数据
};

//任务队列模板类
template <typename T>
class TaskQueue
{
public:
	TaskQueue();
	~TaskQueue();

	//添加一个任务
	void add_task(Task<T> task);
	//重载
	void add_task(callback funtion,void* arg);
	//取出一个任务
	Task<T> take_task();
	//获取当前任务的个数	（定义为内联函数提高效率）
	inline size_t get_task_number()
	{
		return m_task_q.size();
	}

private:
	std::queue<Task<T>> m_task_q;						//任务队列
	pthread_mutex_t m_mx;							//互斥锁	因为任务队列是共享资源
};

